Python2 中的编码问题
part 1:
python2 中的字符串有两种表示形式: str 和 unicode,所谓的编码(encode)就是将 unicode 转换成 str , 而解码(decode)就是将 str 转换为 unicode 。</br>
part 2:
python2中默认编码是ascii,查看方式:</br>1
2
3import sys
print sys.getdefaultencoding()
# 输出: "ascii"
可以通过在文件头加上语句指定编码方式:</br>1
2
3
4
5
6
7
8
9# -*- coding:utf-8 -*-
s = "中国" #必须在文件头加上utf8编码方式的声明,否则默认以ascii编码,而中文不是ascii编码的字符,print s 时会出错
print type(s) # 此时 s 是 str 类型
s1 = s.decode("utf-8") # s 从 str 类型转换为 unicode 类型, 解码方式为 utf-8, 此时 s1 是 unicode 类型
ss = u"中国" # 可以通过这种方式指定 ss 的类型为 unicode。
ss1 = ss.encode("gbk", "ignore") #将 ss 转换为 str 类型, 编码格式是 gbk, 忽略其中有异常的编码
ss1 = ss.encode("gbk", "replace") #替换其中有异常的编码
s2 = s.encode("gbk") #会出现 UnicodeDecodeError,由于文件头有指定编码方式,所有此时 s 是 utf8 编码的 str 类型, 而编码(encode)是 unicode 到 str 的转换, 此时 s 已经是 str 类型了, 所以此时 Python 会根据 sys.getdefaultencoding() 的编码方式进行自动的解码操作,默认的编码方式是 ascii,s2 = s.encode("gbk") 实际上进行了两步, s2 = s.decode("asii").encode("gbk"), 由于 s 是 utf8 编码的 str 类型, 按 ascii 进行解码就会出错。
s2 = s.decode("utf-8").encode("gbk") #能正常运行
part 3:
修改默认的文件编码方式:</br>1
2
3
4
5#! /usr/bin/env python
# -*- coding: utf-8 -*-
improt sys
reload(sys) #由于sys.setdefaultencoding方法在Python导入site.py后就删除了,不能被调用,需要重新载入,否则会出现 AttributeError: 'module' object has no attribute 'setdefaultencoding' 错误
sys.setdefaultencoding("utf-8")